package com.example.entity.dto;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.example.entity.BaseData;
import lombok.Data;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;

/**
 * <p>
 *
 * </p>
 *
 * @author xusen
 * @since 2025-04-24
 */
@Data
@TableName("db_account_privacy")
public class AccountPrivacy implements BaseData {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    final private Integer id;

    @TableField("gender")
    private boolean gender = true;

    @TableField("phone")
    private boolean phone = true;

    @TableField("email")
    private boolean email = true;

    @TableField("qq")
    private boolean qq = true;

    @TableField("wx")
    private boolean wx = true;

    /**
     * 获取当前对象中所有声明为true的boolean类型字段
     * 此方法通过反射遍历对象的所有声明字段，找出类型为boolean且值为true的字段，并返回这些字段的名称
     * 主要用途在于动态确定对象中哪些boolean类型的字段被标记为"隐藏"或"启用"等，根据字段的true值
     *
     * @return String[] 包含所有符合条件的boolean类型字段名称的数组
     */
    public String[] hiddenFields() {
        // 创建一个LinkedList集合，用于存储符合条件的字段名称
        List<String> strings = new LinkedList<>();
        // 获取当前对象的所有声明字段，包括私有、受保护、默认访问和公有的字段
        Field[] fields = this.getClass().getDeclaredFields();
        // 遍历所有字段，寻找符合条件的字段
        for (Field field : fields) {
            try {
                // 检查字段类型是否为boolean，并且字段的值为true
                if (field.getType().equals(boolean.class) && !field.getBoolean(this)) {
                    // 如果条件满足，将字段名称添加到集合中
                    strings.add(field.getName());
                }
            } catch (Exception ignored) {
                // 如果在访问字段过程中发生异常，忽略之
                // 这里可以选择记录日志或者进行其他异常处理操作
            }
        }
        // 将集合转换为字符串数组并返回
        // 使用了Java 8的Stream API简化了转换过程
        return strings.toArray(String[]::new);
    }
}
